package com.demo.java.OD601_650.OD643;

import java.util.Scanner;
import java.util.*;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【九宫格游戏or三阶积幻方(A卷-200分)】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/146973884
 */
public class OdMain {
    public static ArrayList<Integer[]> result;

    public static void main(String[] args) {
        // 处理输入
        Scanner in = new Scanner(System.in);

        Integer[] nums = new Integer[9];
        for (int i = 0; i < 9; i++) {
            nums[i] = in.nextInt();
        }
        result = new ArrayList<>();

        // 全排列核心思想就是每个数字逐个与后面的数字进行交换
        Perm(nums, 0, 8);

        // 排序
        result.sort(
                (a, b) -> {
                    for (int i = 0; i < 9; i++) {
                        if (a[i] != b[i]) return a[i] - b[i];
                    }
                    return 0;
                });

        // 输出
        for (Integer[] single_res : result) {
            for (int i = 0; i < 9; i++) {
                System.out.print(single_res[i]);
                if (i != 8) {
                    System.out.print(" ");
                }
            }
            System.out.println("");
        }

    }

    // 生成全排列
    public static void Perm(Integer a[], int i, int j) {
        if (i == j) {
            if (check(a)) {  // 确保当前排列满足条件
                result.add(Arrays.copyOf(a, 9));  // 将符合条件的排列添加到结果列表
            }
        } else {
            for (int k = i; k <= j; k++) {
                swap(a, i, k);  // 交换第一个与后面每一个进行递归
                Perm(a, i + 1, j);  // 递归
                swap(a, i, k);  // 回溯，恢复交换
            }
        }

    }

    // 检查当前排列是否满足条件
    public static boolean check(Integer a[]) {
        int fixed_result = a[0] * a[1] * a[2];

        // 每行的乘积
        if (fixed_result != a[3] * a[4] * a[5] || fixed_result != a[6] * a[7] * a[8]) {
            return false;
        }

        // 每列的乘积
        if (fixed_result != a[0] * a[3] * a[6] ||
                fixed_result != a[1] * a[4] * a[7] ||
                fixed_result != a[2] * a[5] * a[8]) {
            return false;
        }

        // 对角线的乘积
        if (fixed_result != a[0] * a[4] * a[8] || fixed_result != a[2] * a[4] * a[6]) {
            return false;
        }

        return true;  // 满足所有条件
    }

    // 交换数组中的两个元素
    public static void swap(Integer a[], int k, int i) {
        int t = a[k];
        a[k] = a[i];
        a[i] = t;
    }
}